package com.metrology.app.dao;

import java.util.Collection;
import java.util.List;
import java.util.Map;
   
public interface DomainObjectDao<T> {
	
	/**
	 * 
	 * getSequenceId
	 * @方法作用
	 * get the sequence id.
	 *  
	 * @return
	 *   
	 * Long  
	 * @exception
	 */
	public Long getSequenceId();
	
	/**
	 * 
	 * saveOrUpdate
	 * @方法作用
	 * 根据domain 对象的Id，如果存在执行update操作，如果不存在则执行insert操作。
	 *  
	 * @param obj
	 *   
	 * void  
	 * @exception
	 */
	public void saveOrUpdate(T obj);
	
	/**  
	 * updateWithoutFlush
	 * @方法作用
	 *
	 * 根据domain 对象的Id，执行update操作，不刷新缓存
	 *  
	 * @param obj
	 *   
	 * void  
	 * @exception   
	*/
	public void updateWithoutFlush(T obj);
	
	/**
	 * 
	 * update
	 * @方法作用
	 * 使用某一个特定的sql语句执行更新
	 *  
	 * @param updateSql
	 * @param obj
	 *   
	 * void  
	 * @exception
	 */
	public void update(String updateSql, T obj);
	
	/**
	 * 
	 * insert
	 * @方法作用
	 * 使用某一个特定的sql语句执行Insert
	 *  
	 * @param insertSql
	 * @param obj
	 *   
	 * void  
	 * @exception
	 */
	public void insert(String insertSql, T obj);
	
	/**
	 * 
	 * saveOrUpdate
	 * @方法作用
	 * 批量更新或插入
	 * 根据domain 对象的Id，如果存在执行update操作，如果不存在则执行insert操作。
	 *  
	 * @param objs
	 *   
	 * void  
	 * @exception
	 */
	public void batchSaveOrUpdate(Collection<T> objs);
	
	/**
	 * 
	 * delete
	 * @方法作用
	 * 删除当前对象，只是将delete_flag 标记为1不做物理删除。
	 * 如果需要物理删除请使用方法remove 
	 *  
	 * @param obj
	 *   
	 * void  
	 * @exception
	 */
	public void delete(T obj);
	
	/**
	 * 
	 * delete
	 * @方法作用
	 * 删除指定Id的对象，只是将delete_flag 标记为1不做物理删除。
	 * 如果需要物理删除请使用方法remove 
	 *  
	 * @param obj
	 *   
	 * void  
	 * @exception
	 */
	public void delete(Class<T> domainClass, Long id);
	
	/**
	 * 
	 * remove
	 * @方法作用
	 * 删除指定Id的对象，做物理删除。
	 * 如果需要逻辑删除请使用方法delete
	 *  
	 * @param obj
	 *   
	 * void  
	 * @exception
	 */
	public void remove(T obj);
	
	/**
	 * 
	 * removeAll
	 * @方法作用
	 * 删除所有记录
	 *  
	 * @param clazz
	 *   
	 * void  
	 * @exception
	 */
	public void removeAll(Class<?> clazz);
	
	/**
	 * 
	 * deleteByForeignKey
	 * @方法作用
	 * 根据某一个指定的外键删除当前对象,只做逻辑删除。将delete_flag设置为1
	 *  
	 * @param obj
	 *   
	 * void  
	 * @exception
	 */
	public void deleteByForeignKey(Class<T> domainClass, Long fkey);
	
	/**
	 * 
	 * remove
	 * @方法作用
	 * 删除指定Id的对象，做物理删除。
	 * 如果需要逻辑删除请使用方法delete 
	 *  
	 * @param obj
	 *   
	 * void  
	 * @exception
	 */
	public void remove(Class<T> domainClass, Long id);
	
	/**
	 * 
	 * removeByForeignKey
	 * @方法作用
	 * 根据某一个指定的外键删除当前对象
	 *  
	 * @param obj
	 *   
	 * void  
	 * @exception
	 */
	public void removeByForeignKey(Class<T> domainClass, Long fkey);
	
	/**
	 * 
	 * load
	 * @方法作用
	 * 根据Id 加载某一个特定的对象。
	 *  
	 * @param id
	 * @param domainClass
	 * 
	 * @return 
	 *   
	 * T  
	 * @exception
	 */
	public T load(Class<T> domainClass, Long id);
	
	/**
	 * 
	 * findAll
	 * @方法作用
	 * 加载所有的某一个领域对象
	 *  
	 * @return
	 * 
	 * List<T>  
	 * @exception
	 */
	public List<T> findAll(Class<T> domainClass);
	
	/**
	 * 
	 * findByQueryMap
	 * @方法作用
	 * 通过一个Map参数查询需要的结果集
	 *  
	 * @param params
	 * @return
	 *   
	 * List<T>  
	 * @exception
	 */
	public List<T> findByQueryMap(Map<String, Object> params, String queryName);
	
	public List<T> findByQueryName(String queryName);

	/**  
	 * batchDelete
	 * @方法作用
	 * 逻辑删除对象列表
	 *  
	 * @param objs
	 *   
	 * void  
	 * @exception   
	*/
	void batchDeleteObjs(Collection<T> objs);


}
